﻿using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOPresupuestoMantenimiento
    /// </summary>
    class DAOIMPLPresupuestoMantenimiento:Presupuesto_DAO.DAOPresupuestoMantenimiento
    {
        /// <summary>
        /// Guarda un presupuesto asociado a tareas de mantenimiento
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto</param>
        /// <param name="idMantenimiento">Determina la tarea de mantenimiento</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuestoMantenimiento(int idPresupuesto, int idMantenimiento)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO presupuesto_mantenimiento(id_presupuesto, id_mantenimiento) VALUES(@idPresupuesto, @idMantenimiento)";
                insertar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                insertar.Parameters.AddWithValue("@idMantenimiento", idMantenimiento);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un presupuesto asociado a tareas de mantenimiento
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto</param>
        /// <param name="idMantenimiento">Determina la tarea de mantenimiento</param>
        /// <param name="idP">Determina el presupuesto a modificar</param>
        /// <param name="idM">Determina la tarea a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuestoMantenimiento(int idPresupuesto, int idMantenimiento, int idP, int idM)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE presupuesto_mantenimiento SET id_presupuesto = @idPresupuesto, id_mantenimiento = @idMantenimiento WHERE id_presupuesto = @id_presupuesto AND id_mantenimiento = @id_mantenimiento";
                modificar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                modificar.Parameters.AddWithValue("@idMantenimiento", idMantenimiento);
                modificar.Parameters.AddWithValue("@id_presupuesto", idP);
                modificar.Parameters.AddWithValue("@id_mantenimiento", idM);
                modificar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un presupuesto asociado a tareas de mantenimiento
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuestoMantenimiento(int idPresupuesto)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "DELETE FROM presupuesto_mantenimiento WHERE id_presupuesto = @idPresupuesto";
                eliminar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                eliminar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los presupuestos de mantenimiento
        /// </summary>
        /// <returns>Devuelve una tabla con todos los presupuestos</returns>
        public DataTable getAllPresupuestoMantenimiento()
        {
            DataTable presupuestos_mantenimiento = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();

            try
            {
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT p.codigo, p.precio, p.fecha, p.estado, m.nombre_tarea, m.descripcion FROM presupuesto_mantenimiento pr "
                                    + "INNER JOIN presupuestos p ON pr.id_presupuesto = p.id "
                                    + "INNER JOIN mantenimiento m ON pr.id_mantenimiento = m.id "
                                    + "WHERE p.activo = true GROUP BY p.codigo, m.nombre_tarea";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(presupuestos_mantenimiento);

                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                presupuestos_mantenimiento = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return presupuestos_mantenimiento;
        }

        /// <summary>
        /// Obtiene un presupuesto de mantenimiento
        /// </summary>
        /// <param name="codigoPresupuesto">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuestoMantenimiento</returns>
        public presupuestoMantenimiento getPresupuestoMantenimiento(string codigoPresupuesto)
        {
            presupuestoMantenimiento pm = new presupuestoMantenimiento();
            MySqlConnection conexion = Conexion.conexionMySQL();
            List<string> tareas = new List<string>();
            List<string> descripcion = new List<string>();

            try
            {
                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT p.codigo, p.precio, p.fecha, p.estado, m.nombre_tarea, m.descripcion FROM presupuesto_mantenimiento pr "
                                    + "INNER JOIN presupuestos p ON pr.id_presupuesto = p.id "
                                    + "INNER JOIN mantenimiento m ON pr.id_mantenimiento = m.id "
                                    + "WHERE p.codigo = @codigo";
                consulta.Parameters.AddWithValue("@codigo",codigoPresupuesto);
                MySqlDataReader lector = consulta.ExecuteReader();
                
                String codigo = "";
                String precio = "";
                String fecha = "";
                String estado = "";
                
                while (lector.Read())
                {
                    if (!codigo.Equals(lector["codigo"].ToString()) && !precio.Equals(lector["precio"].ToString())
                        && !fecha.Equals(lector["fecha"].ToString()) && !estado.Equals(lector["estado"].ToString()))
                    {
                        pm.CodigoPresupuesto = lector["codigo"].ToString();
                        pm.Precio = Convert.ToDouble(lector["precio"].ToString());
                        pm.Fecha = Convert.ToDateTime(lector["fecha"].ToString());
                        pm.EstadoPresupuesto = lector["estado"].ToString();
                        descripcion.Add(lector["descripcion"].ToString());
                        tareas.Add(lector["nombre_tarea"].ToString());
                        codigo = lector["codigo"].ToString();
                        precio = lector["precio"].ToString();
                        fecha = lector["fecha"].ToString();
                        estado = lector["estado"].ToString();
                    }
                    else
                    {
                        descripcion.Add(lector["descripcion"].ToString());
                        tareas.Add(lector["nombre_tarea"].ToString());
                    }
                    
                }

                pm.DescripcionTarea = descripcion;
                pm.Tarea = tareas;

                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                pm = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return pm;
        }
    }
}